package com.permissionnanny.lib.request.simple;
import android.accounts.Account;
import android.accounts.OnAccountsUpdateListener;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import com.permissionnanny.lib.Err;
import com.permissionnanny.lib.Event;
import com.permissionnanny.lib.Nanny;
import com.permissionnanny.lib.NannyBundle;
import com.permissionnanny.lib.PPP;
import com.permissionnanny.lib.request.Ack;
import timber.log.Timber;
/**
* Event filter that handles {@link Nanny#ACCOUNTS_UPDATE_SERVICE} responses.
*/
public class AccountsUpdateEvent implements Event {
@PPP public static final String FILTER = "AccountsUpdateEvent";
@PPP public static final String ACCOUNTS = "accounts";
private final OnAccountsUpdateListener mListener;
private final Handler mHandler;
private final Ack mAck;
public AccountsUpdateEvent(OnAccountsUpdateListener listener, @Nullable Handler handler) {
this(listener, handler, new Ack());
}
@VisibleForTesting
public AccountsUpdateEvent(OnAccountsUpdateListener listener, @Nullable Handler handler, Ack ack) {
mListener = listener;
mHandler = handler != null ? handler : new Handler(Looper.getMainLooper());
mAck = ack;
}
@Override
public String filter() {
return FILTER;
}
@Override
public void process(Context context, Intent intent) {
mAck.sendAck(context, intent);
Bundle entity = new NannyBundle(intent).getEntityBody();
if (entity == null) {
Timber.wtf(Err.NO_ENTITY);
return;
}
final Parcelable[] parcels = entity.getParcelableArray(ACCOUNTS);
if (parcels == null) {
Timber.wtf(Err.NO_ACCOUNTS);
return;
}
mHandler.post(new Runnable() {
@Override
public void run() {
Account[] accounts = new Account[parcels.length];
System.arraycopy(parcels, 0, accounts, 0, parcels.length);
mListener.onAccountsUpdated(accounts);
}
});
}
}